﻿using System;
using System.Xml;
using static System.Console;
using System.Drawing;
/*暴力出奇迹（bushi）*/
namespace test3_calendar
{
    class month
    {
        private int days;
        private int start_weekday;
        private int monthh;
        public month(int da,int st,int mon)
        {
            days = da;
            start_weekday=st;
            monthh = mon;
        }

        public void put_cursor(int mon,int line)//设置输出位置，四种情况对应四行
        {
            if (mon>0&&mon<4)
            {
                SetCursorPosition(25*mon,line);
            }
            else if (mon>3&&mon<7)
            {
                SetCursorPosition(25*(mon-3),line+9);
            }
            else if (mon>6&&mon<10)
            {
                SetCursorPosition(25*(mon-6),line+18);
            }
            else
            {
                SetCursorPosition(25*(mon-9),line+27);
            }
        }
        public void put_monthname(int mon)//写出几月
        {
            put_cursor(mon,0);
            Write("{0,10}月",mon);
            WriteLine();
        }

        public void put_dayname(int mon)//写出周几
        { 
            //SetCursorPosition(mon*2,0); 
            put_cursor(mon,1);
            Write("日 一 二 三 四 五 六");
            WriteLine();
        }

        public void put_date(int st,int mon)//写出具体日期
        {
            DateTime today = DateTime.Now;
            st = start_weekday;
            int temp_firstline = 1;
            int temp_time = 0;
            int temp_line = 4;//开始写第二行日期的行数
            //SetCursorPosition(25*mon,3);
            //写第一部分的日期，即每月的第一行
           
            put_cursor(mon,2);
            for (int i = 0; i < st; i++)
            {
                Write("   ");//和上面的汉字对其，看是从星期几开始的，星期几开始就画3*几个空格（汉字2格+空格一格）
            }
            
            for (int i = 1; i <=7-st; i++)
            {
                if (mon==today.Month&&i==today.Day)
                {
                    ForegroundColor = ConsoleColor.Red;
                    Write(i);
                    ForegroundColor = ConsoleColor.Black;
                }
                else
                {
                    Write(i);
                }
                Write("  ");//第一行没有两位数，所以画俩空格
                temp_firstline = i;
            }
            WriteLine();//换行开始写剩下的日期
            //SetCursorPosition(25*mon,4);
            put_cursor(mon,3);
            for (int i = temp_firstline+1; i <=days; i++)
            {
                temp_time++;
                 if (mon==today.Month&&i==today.Day)
                {
                    ForegroundColor = ConsoleColor.Red;
                    Write(i);
                    ForegroundColor = ConsoleColor.Black;
                }
                 else
                 {
                     Write(i);
                 }
                 if (i<10)
                {
                    Write("  ");//一位数画俩空格
                }
                else
                {
                    Write(" ");//不是一位数就是两位数，两位数画一个就对齐了
                }
                if (temp_time % 7 == 0)//七天打一行
                {
                    WriteLine();
                    //SetCursorPosition(25*mon,temp_line);
                    put_cursor(mon,temp_line);
                    temp_line++;
                }
            }
        }
    }
    internal class Program
    {
        public static void doo()//干 函数
        {
            DateTime dt = new DateTime(2021, 12,1);
            int[] startweekday = new int[16];//一个记录每个月从周几开始的数组，周日记为0
            for (int i = 1; i < 13; i++)
            {
                DateTime temp=dt.AddMonths(i);
                startweekday[i] = (int)temp.DayOfWeek;
                // if (startweekday[i]==7)
                // {
                //     startweekday[i] = 0;
                // }//中国版加个这个就行
            }
            month[] mon = new month[16];
            for (int i = 1; i<13; i++)
            {
                if (i == 1 || i == 3 || i == 5 || i == 7 || i == 8 || i == 10 || i == 12)//如果是大月
                {
                    mon[i] = new month(31, startweekday[i],i);
                    //Write("   ");
                }
                else if (i == 2)//如果是二月
                {
                    mon[i] = new month(28, startweekday[i],i);
                }
                else//如果是小月
                {
                    mon[i] = new month(30, startweekday[i],i);
                }
                mon[i].put_monthname(i);//写出月份名字
                mon[i].put_dayname(i);
                mon[i].put_date(startweekday[i],i);
                WriteLine();
                //SetCursorPosition(50,0);
            } 
        }
        public static void Main(string[] args)
        {
            doo();//干他就完了！
        }
    }
}